from reedsolo import RSCodec, ReedSolomonError


def encode_data(data, nsym):
    """
    对输入数据进行里德 - 所罗门码编码
    :param data: 输入的数据
    :param nsym: 冗余符号的数量
    :return: 编码后的数据
    """
    rsc = RSCodec(nsym)
    encoded = rsc.encode(data)
    return encoded


def decode_data(encoded_data, nsym):
    """
    对编码后的数据进行里德 - 所罗门码解码
    :param encoded_data: 编码后的数据
    :param nsym: 冗余符号的数量
    :return: 解码后的数据
    """
    rsc = RSCodec(nsym)
    try:
        decoded = rsc.decode(encoded_data)
        return decoded
    except ReedSolomonError:
        print("解码失败，可能错误过多无法纠正。")
        return None


def truncate_and_pad(data):
    """
    将字符串截断为 33 个字符，不足 33 位的用 \0 填充
    :param data: 输入的字符串
    :return: 处理后的字节串
    """
    # 截断字符串
    truncated = data[:50]
    # 填充 \0
    padded = truncated.ljust(50, '\0')
    # 转换为字节串
    return padded.encode()


if __name__ == "__main__":
    data = "Hello, Reed - Solomon Code!SolomonCode"
    print("原始数据:", data,"len:",len(data))
    nsym = 50

    # 截断并填充数据
    processed_data = truncate_and_pad(data)
    print("处理后的数据:", processed_data)

    # 编码数据
    encoded = encode_data(processed_data, nsym)
    print("编码后的数据:", encoded)

    encoded[0] = encoded[0] + 1
    encoded[1] = encoded[1] + 1
    encoded[2] = encoded[2] + 1
    encoded[3] = encoded[3] + 1
    encoded[4] = encoded[4] + 1
    encoded[5] = encoded[5] + 1
    encoded[6] = encoded[6] + 1
    encoded[7] = encoded[7] + 1
    encoded[8] = encoded[8] + 1
    encoded[9] = encoded[9] + 1
    encoded[60] = encoded[10] + 1
    encoded[61] = encoded[11] + 1

    # 解码数据
    decoded = decode_data(encoded, nsym)
    if decoded:
        print("解码后的数据:", decoded[0].decode().rstrip('\0'))
